package com.gzq.singleton.exam00;

public class LhDoubleCheckLock {

    private static volatile LhDoubleCheckLock singleton = null;

    private LhDoubleCheckLock() {
    }

    public synchronized static LhDoubleCheckLock getSingleton() {
        // 第一次校验
        if (singleton == null) {
            synchronized (LhDoubleCheckLock.class) {
                // 第二次校验
                /*
                    注意：
                        如果new之后，后续还有很多初始化的操作。
                        那么立即获取单例，会得到一个没有初始化完成的对象。
                        所以，双重校验锁不能解决有后续初始化的问题。

                        可以尝试，通过最后标志位来解决最终初始化完成的问题。
                     */
                if (singleton == null) {
                    singleton = new LhDoubleCheckLock();
                }
            }
        }
        return singleton;
    }

}
